
package com.huaweicloud.saaslanding.install.repository;

import com.baomidou.mybatisplus.annotation.InterceptorIgnore;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;

/**
 * 功能描述
 *
 * @since 2022-05-31
 */
@Repository
public interface DataRepository {
    /**
     * 初始化 资源表（hsl_resource）
     *
     * @param appId 平台侧控制台应用
     * @return int
     */
    int insertSaasResource(@Param("app_id") Long appId);

    /**
     * 初始化 应用资源表（hsl_app_resource） 租户侧控制台应用
     *
     * @param appId 租户侧控制台应用
     * @return int
     */
    int insertTenantResource(@Param("app_id") Long appId);

    /**
     * 初始化 应用资源表（hsl_app_resource） 酒店应用
     *
     * @param appId 酒店应用
     * @return int
     */
    int insertHotelResource(@Param("app_id") Long appId);

    /**
     * 初始化 应用资源表（hsl_app_resource） 电商应用
     *
     * @param appId 电商应用
     * @return int
     */
    int insertBusinessResource(@Param("app_id") Long appId);

    /**
     * 初始化 应用资源表（hsl_app_resource） 云商店微服务架构应用
     *
     * @param appId 云商店微服务架构应用ID
     * @return int
     */
    int insertMicroResource(@Param("app_id") Long appId);

    /**
     * 初始化标签数据：包括行业、所在地、来源渠道
     */
    void insertLabel();

    /**
     * 获取数据库内所有表名
     *
     * @param database 数据库名
     * @return List<String> 表名
     */
    @InterceptorIgnore(tenantLine = "true")
    List<String> findTables(@Param("database") String database);

    /**
     * 将外键设置失效
     *
     * @return int
     */
    void setForeignKeyChecksInvalid();

    /**
     * 将外键设置生效
     *
     * @return int
     */
    void setForeignKeyChecksValid();

    /**
     * 删除isv平台控制测数据库
     *
     * @param tables List<String> 表名
     * @param database 数据库名
     * @return int
     */
    @InterceptorIgnore(tenantLine = "true")
    int deleteISVConsoleDb(@NotEmpty @Param("tables") List<String> tables, @NotNull @Param("database") String database);

    /**
     * 删除租户测数据库
     *
     * @param dbs List<String> 数据库名
     * @return int
     */
    @InterceptorIgnore(tenantLine = "true")
    int deleteTenantConsoleDb(@NotEmpty @Param("dbs") List<String> dbs);

    /**
     * 插入云商店单体应用相关数据
     */
    void initMonoAppData();

    /**
     * 插入云商店License应用相关数据
     */
    void initLicenseAppData();

    /**
     * 插入云商店微服务架构应用相关数据
     */
    void initMicroAppData();

    /**
     * 初始化业务应用API表
     *
     * @param busAppId 电商应用ID
     * @param hotelAppId 酒店应用ID
     * @param microAppId 微服务架构应用ID
     */
    void initAppServiceApi(@Param("bus_app_id") Long busAppId, @Param("hotel_app_id") Long hotelAppId,
        @Param("micro_app_id") Long microAppId);

    /**
     * 初始化酒店应用API
     *
     * @param hotelAppId 酒店应用ID
     */
    void initHotelAppServiceApi(@Param("hotel_app_id") Long hotelAppId);

    /**
     * 初始化电商应用API
     *
     * @param busAppId 电商应用ID
     */
    void initBusAppServiceApi(@Param("bus_app_id") Long busAppId);

    /**
     * 初始化微服务架构应用API
     *
     * @param microAppId 微服务架构应用ID
     */
    void initMicroAppServiceApi(@Param("micro_app_id") Long microAppId);

    /**
     * 初始化酒店应用功能列表
     *
     * @param hotelAppId 酒店应用ID
     */
    void initHotelAppFunctions(@Param("hotel_app_id") Long hotelAppId);

    /**
     * 初始化电商应用功能列表
     *
     * @param busAppId 电商应用ID
     */
    void initBusAppFunctions(@Param("bus_app_id") Long busAppId);

    /**
     * 初始化微服务架构应用功能列表
     *
     * @param microAppId 微服务架构应用ID
     */
    void initMicroAppFunctions(@Param("micro_app_id") Long microAppId);
}
